/**
 * src/pages/user/index.tsx
 * ------------------------------------
 * 用户个人中心页面组件
 * 1. 用户信息展示：头像、昵称、积分、会员等级等
 * 2. 身份系统：身份选择、亲密度展示、特殊内容解锁
 * 3. 功能菜单：订单历史、积分记录、设置、反馈等
 * 4. 通知中心：未读通知提醒和消息管理
 * 5. 会员中心：会员等级、权益展示、升级进度
 * 该页面是用户管理个人信息和使用各种功能的主要入口
 * 创建日期：2025-08-06
 */
import React, { useState, useEffect } from 'react'
import { View, Text, Button, Image } from '@tarojs/components'
import Taro, { useDidShow } from '@tarojs/taro'
import { useAppContext } from '../../store'
import MemberCenter from '../../components/MemberCenter'
import NetworkStatus from '../../components/NetworkStatus'
import NotificationCenter from '../../components/NotificationCenter'
import IntimacyDisplay from '../../components/IntimacyDisplay'
import { CloudDataManager } from '../../utils/cloud'
import { CloudFunctionManager } from '../../utils/cloudFunctionManager'
import { pointsUtils } from '../../utils/pointsUtils'
import { Notification } from '../../types'
import './index.scss'

/**
 * 用户个人中心页面组件
 * 提供用户登录、身份选择、亲密度展示等功能
 * 集成会员中心、通知中心、网络状态监控等组件
 */
const UserPage: React.FC = () => {
  const { state, dispatch } = useAppContext()
  // 网络状态
  const [isOnline, setIsOnline] = useState(true)
  // 登录加载状态
  const [loading, setLoading] = useState(false)
  // 通知中心显示状态
  const [showNotifications, setShowNotifications] = useState(false)
  // 未读通知数量
  const [unreadNotifications, setUnreadNotifications] = useState(0)
  const [loginInProgress, setLoginInProgress] = useState(false) // 新增登录状态控制
  
  /**
   * 页面显示时的处理函数
   * 检查登录状态和获取未读通知数量
   * 每次页面显示时都会执行
   */
  useDidShow(() => {
    checkLoginStatus()
    if (state.currentUser) {
      fetchUnreadNotificationsCount()
    }
  })
  
  /**
   * 检查登录状态
   * 如果用户未登录，显示提示信息
   * 确保用户在使用功能前已登录
   */
  const checkLoginStatus = async () => {
    if (!state.currentUser) {
      Taro.showToast({
        title: '请先登录',
        icon: 'none'
      })
    }
  }
  
  /**
   * 获取未读通知数量
   * 从云数据库获取用户的未读通知
   * 用于在界面上显示未读消息提醒
   */
  const fetchUnreadNotificationsCount = async () => {
    if (!state.currentUser?.id || !isOnline) return
    
    try {
      const notifications = await CloudDataManager.getAllData('notifications', {
        userId: state.currentUser.id,
        isRead: false
      })
      
      setUnreadNotifications(notifications.length)
    } catch (error) {
      console.error('获取未读通知数量失败:', error)
    }
  }
  
  /**
   * 处理微信登录 - 增强版本，添加防重复点击和超时控制
   * 获取用户信息并调用登录云函数
   * 完成登录后更新用户状态
   */
  const handleLogin = async () => {
    // 防止重复登录
    if (loginInProgress) {
      Taro.showToast({
        title: '正在登录中...',
        icon: 'none'
      })
      return
    }
    
    try {
      setLoading(true)
      setLoginInProgress(true)
      
      // 显示登录进度
      Taro.showLoading({ title: '正在登录...' })
      
      // 获取用户信息
      const { userInfo } = await Taro.getUserProfile({
        desc: '用于完善会员资料'
      })
      
      // 登录微信
      const { code } = await Taro.login()
      
      // 设置云函数调用超时
      const result = await CloudFunctionManager.callFunction('login', {
        code,
        userInfo
      }, {
        timeout: 15000,
        retry: true,
        maxRetries: 2
      })
      
      // 隐藏加载状态
      Taro.hideLoading()
      
      // 处理登录结果
      if (result && typeof result === 'object') {
        if (result.success && result.data?.user) {
          // 更新全局状态
          dispatch({
            type: 'SET_USER',
            payload: result.data.user
          })
          
          // 如果是新用户，给予注册积分奖励
          if (result.data.isNewUser) {
            await pointsUtils.processRegistrationPoints(result.data.user.id)
            
            Taro.showToast({
              title: '注册成功，获得100积分奖励',
              icon: 'none',
              duration: 2000
            })
          } else {
            Taro.showToast({
              title: '登录成功',
              icon: 'success'
            })
          }
          
          // 获取未读通知数量
          fetchUnreadNotificationsCount()
        } else {
          Taro.showToast({
            title: result.error || '登录失败',
            icon: 'none'
          })
        }
      }
    } catch (error) {
      console.error('登录失败:', error)
      Taro.hideLoading()
      
      let errorMessage = '登录失败，请重试'
      if (error instanceof Error) {
        if (error.message.includes('超时')) {
          errorMessage = '登录超时，请检查网络后重试'
        } else if (error.message.includes('getUserProfile')) {
          errorMessage = '需要授权用户信息才能登录'
        }
      }
      
      Taro.showToast({
        title: errorMessage,
        icon: 'none'
      })
    } finally {
      setLoading(false)
      setLoginInProgress(false)
    }
  }
  
  /**
   * 处理退出登录
   * 显示确认对话框，确认后清除用户状态
   */
  const handleLogout = () => {
    Taro.showModal({
      title: '提示',
      content: '确定要退出登录吗？',
      success: (res) => {
        if (res.confirm) {
          dispatch({ type: 'LOGOUT' })
          Taro.showToast({
            title: '已退出登录',
            icon: 'success'
          })
        }
      }
    })
  }

  /**
   * 处理网络状态变化
   * @param onlineStatus 网络状态
   */
  const handleNetworkStatusChange = (onlineStatus: boolean) => {
    setIsOnline(onlineStatus)
  }

  /**
   * 打开通知中心
   */
  const openNotifications = () => {
    setShowNotifications(true)
  }

  /**
   * 关闭通知中心
   */
  const closeNotifications = () => {
    setShowNotifications(false)
  }

  /**
   * 跳转到身份选择页面
   */
  const handleSelectIdentity = () => {
    Taro.navigateTo({
      url: '/pages/identity/selection/index'
    })
  }
  
  return (
    <View className='user-page'>
      {/* 网络状态提示组件 */}
      <NetworkStatus onStatusChange={handleNetworkStatusChange} />
      
      {/* 用户信息卡片 */}
      <View className='user-card'>
        {state.currentUser ? (
          // 已登录用户信息
          <View className='user-info'>
            <Image 
              className='avatar' 
              src={state.currentUser.avatar || '/assets/images/default-avatar.png'}
            />
            <View className='info-content'>
              <Text className='name'>{state.currentUser.name}</Text>
              <Text className='role'>{state.currentUser.role === 'chef' ? '厨师' : '用户'}</Text>
            </View>
            <Button className='logout-btn' onClick={handleLogout}>退出</Button>
          </View>
        ) : (
          // 未登录状态
          <View className='login-container'>
            <Text className='login-tip'>请登录以使用完整功能</Text>
            <Button 
              className='login-btn' 
              onClick={handleLogin}
              loading={loading}
            >
              微信登录
            </Button>
          </View>
        )}
        
        {/* 通知按钮 */}
        {state.currentUser && (
          <View 
            className='notification-button'
            onClick={openNotifications}
          >
            <Text className='notification-icon'>🔔</Text>
            {unreadNotifications > 0 && (
              <View className='notification-badge'>{unreadNotifications}</View>
            )}
          </View>
        )}
      </View>

      {/* 身份选择提示 - 仅对已登录但未选择身份的用户显示 */}
      {state.currentUser && !state.currentUser.identityType && (
        <View className='identity-prompt'>
          <Text className='prompt-title'>选择您的身份</Text>
          <Text className='prompt-desc'>选择身份后可以解锁专属内容</Text>
          <Button className='select-identity-btn' onClick={handleSelectIdentity}>
            选择身份
          </Button>
        </View>
      )}
      
      {/* 亲密度展示组件 - 仅对已选择身份的用户显示 */}
      {state.currentUser && state.currentUser.identityType && (
        <IntimacyDisplay
          userId={state.currentUser.id}
          intimacy={state.currentUser.intimacy || 0}
          identitySubType={state.currentUser.identitySubType || ''}
          identityName={state.currentUser.identityName || ''}
        />
      )}
      
      {/* 会员中心组件 - 仅对已登录用户显示 */}
      {state.currentUser && (
        <MemberCenter userId={state.currentUser.id} />
      )}
      
      {/* 功能菜单 */}
      <View className='menu-section'>
        <Text className='section-title'>功能菜单</Text>
        <View className='menu-grid'>
          <View className='menu-item' onClick={() => Taro.navigateTo({ url: '/pages/points/history' })}>
            <Text className='menu-icon'>📊</Text>
            <Text className='menu-text'>积分历史</Text>
          </View>
          <View className='menu-item' onClick={() => Taro.navigateTo({ url: '/pages/points/rules' })}>
            <Text className='menu-icon'>📋</Text>
            <Text className='menu-text'>积分规则</Text>
          </View>
          <View className='menu-item' onClick={() => Taro.navigateTo({ url: '/pages/points/forecast' })}>
            <Text className='menu-icon'>🔮</Text>
            <Text className='menu-text'>积分预测</Text>
          </View>
          <View className='menu-item' onClick={() => Taro.navigateTo({ url: '/pages/settings/index' })}>
            <Text className='menu-icon'>⚙️</Text>
            <Text className='menu-text'>设置</Text>
          </View>
        </View>
      </View>

      {/* 通知中心组件 */}
      {showNotifications && (
        <NotificationCenter 
          onClose={closeNotifications}
        />
      )}
    </View>
  )
}

export default UserPage 